import { defineStore } from 'pinia'
import { buyProducts, IProduct } from '../api/shop'
import { useProdunctsStore } from './products'
import { useMainStore } from '../store/index'

/**
 * {id, title, price, quantity}
 */
type CartProduct = {
  // 合并
  num: number
} & Omit<IProduct, 'inventory'> // Omit是过滤
// 这段话意思是 一个去除IProduct类的invntory属性的CartProduct类，同时新增一个number类型的num在cartProduct里面
// 类似是：const someProduct: IProduct = {
//     id: '123',
//     name: 'Product Name',
//     price: 10.5,
//     inventory: 100,
//     // ...
//   }

//   const someCartProduct: CartProduct = {
//     id: '123',
//     name: 'Product Name',
//     price: 10.5,
//     num: 2,
//     // ...
//   }
export const useCartStore = defineStore('cart', {
  state: () => {
    return {
      cartProducts: [] as CartProduct[],
      checkoutStatus: null as null | string,
    }
  },

  getters: {
    // 总价
    totalPrice(state) {
      return state.cartProducts.reduce((total, item) => {
        return total + item.price * item.num
      }, 0)
    },
  },

  actions: {
    /**
     * 往购物车添加商品
     * 这是一个相对复杂的逻辑，与容器中的数据强相关，所以肯定要定义在actions里面！
     * @param product 需要添加的商品
     */
    addProductToCart(product: IProduct) {
      // 先看商品有没有库存
      if (product.inventory <= 0) {
        return
      }
      // 检查购物车中是否已有该商品

      const cartItem = this.cartProducts.find((item) => item.id === product.id)
      // 如果有则让商品数量+1
      if (cartItem) {
        cartItem.num++
      } else {
        // 如果没有则添加到购物车列表中
        this.cartProducts.push({
          id: product.id,
          title: product.title,
          price: product.price,
          num: 1,
        })
      }

      // 跟新商品库存（应该由商品容器暴露API）
      const productsStore = useProdunctsStore()
      productsStore.decrementProduct(product)
      // 跨容器通信！！！！！竟然如此简单！！！
    },
    /**
     * 结算
     */
    async checkOut(price: number) {
      const ret = await buyProducts(price)
      if (!ret) {
        return
      }
      useMainStore().changeCount(price)
      this.checkoutStatus =
        ret && useMainStore().count > 0 ? '成功' : '失败,检查您的余额！'
      if (ret && useMainStore().count > 0) {
        this.cartProducts = [] // 清空购物车
      } else {
        useMainStore().count = 100
      }
    },
    changeCartNum(product: any) {
      const cartsItem = this.cartProducts.find((item) => item.id === product.id)
      const productsStore = useProdunctsStore()
      productsStore.addProduct(product)
      if (cartsItem) {
        cartsItem.num--
      }
    },
  },
})
